//
//  责任链模式通用代码.swift
//  DutyChainPattern
//
//  Created by mac on 2017/11/8.
//  Copyright © 2017年 RRC. All rights reserved.
//

import Foundation

//定义一个请求和处理等级
enum Level {
    case one
    case two
}

public class Request {
    //请求的等级
    func getRequestLevel() -> Level {
        return Level.two
    }
}

public class Response{
    //处理者返回的数据
}

//抽象处理者
public class TYHandler{
    private var nextTYHnadler:TYHandler?
    //每个处理者都必须对请求做出处理
    final func tyhandleMessage(request:Request) ->Response{
        let response = Response()
        
        return response
    }
    //设置下一个处理者是谁
    func setNext(tyhandler:TYHandler){
        self.nextTYHnadler = tyhandler
    }
    //每个处理者都有一个处理级别
    func getTYHandlerLevel() -> Level{
        return Level.one
    }
    //每个处理者都必须实现处理任务
    func echo(request:Request) -> Response{
        return Response()
    }
}

//实现几个具体的处理者
public class ConcreteHnadler1:TYHandler{
    //定义自己的处理逻辑
    override func echo(request: Request) -> Response {
        //完成处理逻辑
        return Response()
    }
    
    //设置自己的处理级别
    override func getTYHandlerLevel() -> Level {
        //设置自己的处理级别
        return Level.two
    }
}

public class ConcreteHnadler2:TYHandler{
    //定义自己的处理逻辑
    override func echo(request: Request) -> Response {
        //完成处理逻辑
        return Response()
    }
    
    //设置自己的处理级别
    override func getTYHandlerLevel() -> Level {
        //设置自己的处理级别
        return Level.two
    }
}

public class ConcreteHnadler3:TYHandler{
    //定义自己的处理逻辑
    override func echo(request: Request) -> Response {
        //完成处理逻辑
        return Response()
    }
    
    //设置自己的处理级别
    override func getTYHandlerLevel() -> Level {
        //设置自己的处理级别
        return Level.two
    }
}

//场景类
/**
 在实际应用中，一般会有一个封装类对责任模式进行封装，替代Client类，直接返回链中的第一个处理者，具体链的设置不需要高层次模块关系，这样，更简化了高层次模块的调用，减少模块间的耦合，提高系统的灵活性
 */
public class Client{
    public static func main(args:[String]){
        
        //声明所有的处理节点
        let handler1:TYHandler = ConcreteHnadler1()
        let handler2:TYHandler = ConcreteHnadler2()
        let handler3:TYHandler = ConcreteHnadler3()
        //设置链中的阶段顺序 1--->2--->3
        handler1.setNext(tyhandler: handler2)
        handler2.setNext(tyhandler: handler3)
        //提交请求，返回结果
        let _:Response = handler1.tyhandleMessage(request: Request())
    }
}

